#include <iostream>
#include <memory>

class A;
class B;

/**
 * 1. 使用前提：出现以下两个循环引用的时候使用
 * 2. 一个类中使用 shared_ptr，另一个类中使用 weak_ptr
*/
class A {
public:
    // A 或 B 中至少有一个使用 weak_ptr
    std::weak_ptr<B> pointer;
    A() {
        std::cout << "A()" << std::endl;
    }
    ~A() {
        std::cout << "A 被销毁" << std::endl;
    }
};

class B {
public:
    std::shared_ptr<A> pointer;
    B() {
        std::cout << "B()" << std::endl;
    }
    ~B() {
        std::cout << "B 被销毁" << std::endl;
    }
};


int main()
{
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();
    a->pointer = b;
    b->pointer = a;

    return 0;
}